package main

import "fmt"

func main() {

	//	IF
	//可省略条件表达式括号
	//支持初始化语句,可定义代码块局部变量
	//代码块左大括号必须在条件表达式尾部
	x := 0
	if n := "abc"; x > 0 {
		println(n[2])
	} else if x < 0 {
		println(n[1])
	} else {
		println(n[0])
	}
	//不支持三元操作符
	//For
	s := "abc"
	for i, n := 0, len(s); i < n; i++ {
		println("输出:", s[i])
	}
	for i, n := 0, length(s); i < n; i++ {
		println(i, s[i])
	}

	//Range类似迭代器操作,返回(索引,值)或(键,值)
	for i := range s {
		println(s[i])
	}
	for _, c := range s {
		println(c)
	}
	m := map[string]int{"a": 1, "b": 2}
	println("返回键值对")
	for k, v := range m {
		println(k, v)
	}
	//	注意,range会复制对象
	fmt.Println("会复制")
	a1 := [3]int{0, 1, 2}
	for i, v := range a1 { //index,value都是从复制品中取出
		if i == 0 { //在修改前,我们先修改原数组
			a1[1], a1[2] = 999, 999
			fmt.Println("1", a1) //确定修改有效,输出[0,999,999]
		}
		a1[i] = v + 100 //使用复制品取出的value修改原数组
	}
	fmt.Println("2", a1) //输出
	//建议使用引用类型,其底层数据不会被复制
	b := []int{1, 2, 3, 4, 5}
	for i, v := range b {//复制struct slice{pointer,len,cap}
		if i == 0 {
			b = b[:3]  		//对slice的修改,不会影响range
			b[2] = 100		//对底层数据的修改
		}
		fmt.Println("引用类型")
		fmt.Println(i, v)

	}

}

//长度函数
func length(s string) int {
	println("长度:")
	return len(s)
}
